#!/usr/bin/env python
# -*- coding: utf-8 -*-

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
from pyecharts.charts import Line, Bar, Pie, Map, Grid
from pyecharts import options as opts
from pyecharts.globals import ThemeType
import warnings
warnings.filterwarnings('ignore')

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'Arial Unicode MS']
plt.rcParams['axes.unicode_minus'] = False

def read_csv_with_encoding(file_path):
    """尝试不同编码读取CSV文件"""
    encodings = ['utf-8', 'gbk', 'gb2312', 'gb18030', 'cp936']
    
    for encoding in encodings:
        try:
            df = pd.read_csv(file_path, encoding=encoding)
            print(f"✅ {file_path} 读取成功，使用编码: {encoding}")
            return df
        except (UnicodeDecodeError, UnicodeError):
            continue
        except Exception as e:
            print(f"❌ 读取 {file_path} 时发生其他错误: {e}")
            continue
    
    print(f"❌ 无法读取文件 {file_path}")
    return None

def extract_data_by_keyword(df, keyword, year_columns):
    """根据关键词提取数据"""
    try:
        # 查找包含关键词的行
        mask = df.iloc[:, 0].astype(str).str.contains(keyword, na=False)
        rows = df[mask]
        
        if len(rows) == 0:
            print(f"⚠️ 未找到包含 '{keyword}' 的数据")
            return [0] * len(year_columns)
        
        row = rows.iloc[0]
        data = []
        
        for year in year_columns:
            if year in df.columns:
                value = row[year]
                try:
                    # 尝试转换为浮点数
                    if pd.isna(value) or value == '' or value == ' ':
                        data.append(0)
                    else:
                        data.append(float(str(value).strip()))
                except (ValueError, TypeError):
                    data.append(0)
            else:
                data.append(0)
        
        return data
    except Exception as e:
        print(f"❌ 提取 '{keyword}' 数据时出错: {e}")
        return [0] * len(year_columns)

def main():
    print("🚀 开始数据可视化分析...")
    
    # 读取数据文件
    print("\n📊 读取数据文件...")
    broadcast_df = read_csv_with_encoding('数据文件/广播电视情况.csv')
    population_df = read_csv_with_encoding('数据文件/人口年龄结构.csv')
    realestate_df = read_csv_with_encoding('数据文件/2024年12月全国地区房地产投资累计值.csv')
    
    # 任务一：有线广播电视用户数情况
    if broadcast_df is not None:
        print("\n📈 任务一：绘制有线广播电视用户数折线图...")
        
        years = ['2019年', '2020年', '2021年', '2022年', '2023年']
        year_labels = [y.replace('年', '') for y in years]
        
        # 提取数据
        national_data = extract_data_by_keyword(broadcast_df, '全国有线广播电视用户数', years)
        rural_data = extract_data_by_keyword(broadcast_df, '农村有线广播电视用户数', years)
        
        # 使用pyecharts绘制折线图
        line = (
            Line(init_opts=opts.InitOpts(theme=ThemeType.MACARONS, width="900px", height="600px"))
            .add_xaxis(year_labels)
            .add_yaxis("全国有线广播电视用户数", national_data, 
                      markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="max")]))
            .add_yaxis("农村有线广播电视用户数", rural_data,
                      markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="max")]))
            .set_global_opts(
                title_opts=opts.TitleOpts(
                    title="5年期间有线广播电视用户数情况",
                    subtitle="单位：万户",
                    pos_left="center"
                ),
                xaxis_opts=opts.AxisOpts(name="年份"),
                yaxis_opts=opts.AxisOpts(name="用户数"),
                tooltip_opts=opts.TooltipOpts(trigger="axis"),
                legend_opts=opts.LegendOpts(pos_top="10%"),
                datazoom_opts=[opts.DataZoomOpts(range_start=0, range_end=100)]
            )
        )
        line.render("任务一_有线广播电视用户数情况.html")
        print("✅ 任务一完成，生成文件：任务一_有线广播电视用户数情况.html")
        
        # 任务二：电影票房收入柱状图
        print("\n📊 任务二：绘制电影票房收入柱状图...")
        
        domestic_data = extract_data_by_keyword(broadcast_df, '国产电影票房收入', years)
        import_data = extract_data_by_keyword(broadcast_df, '进口电影票房收入', years)
        
        bar = (
            Bar(init_opts=opts.InitOpts(theme=ThemeType.MACARONS, width="900px", height="600px"))
            .add_xaxis(year_labels)
            .add_yaxis("国产电影票房收入", domestic_data)
            .add_yaxis("进口电影票房收入", import_data)
            .set_global_opts(
                title_opts=opts.TitleOpts(
                    title="5年期间国产和进口电影票房收入",
                    subtitle="单位：亿元",
                    pos_left="center"
                ),
                xaxis_opts=opts.AxisOpts(name="年份"),
                yaxis_opts=opts.AxisOpts(name="票房收入"),
                tooltip_opts=opts.TooltipOpts(trigger="axis"),
                legend_opts=opts.LegendOpts(orient="vertical", pos_right="5%", pos_top="15%"),
                datazoom_opts=[opts.DataZoomOpts(range_start=0, range_end=100)]
            )
        )
        bar.render("任务二_国产和进口电影票房收入.html")
        print("✅ 任务二完成，生成文件：任务二_国产和进口电影票房收入.html")
    
    # 任务三：人口年龄结构与抚养比
    if population_df is not None:
        print("\n🥧 任务三：绘制人口年龄结构饼图...")
        
        year_col = ['2023年']
        
        # 人口年龄结构数据
        age_0_14 = extract_data_by_keyword(population_df, '0-14岁人口', year_col)[0]
        age_15_64 = extract_data_by_keyword(population_df, '15-64岁人口', year_col)[0]
        age_65_plus = extract_data_by_keyword(population_df, '65岁及以上人口', year_col)[0]
        
        # 抚养比数据
        total_ratio = extract_data_by_keyword(population_df, '总抚养比', year_col)[0]
        child_ratio = extract_data_by_keyword(population_df, '少儿抚养比', year_col)[0]
        elderly_ratio = extract_data_by_keyword(population_df, '老年抚养比', year_col)[0]
        
        print(f"📊 提取的数据：")
        print(f"   人口结构 - 0-14岁：{age_0_14}万人，15-64岁：{age_15_64}万人，65岁以上：{age_65_plus}万人")
        print(f"   抚养比 - 总抚养比：{total_ratio}%，少儿抚养比：{child_ratio}%，老年抚养比：{elderly_ratio}%")
        
        # 方法一：创建单独的饼图和圆环图，然后使用Tab组合
        from pyecharts.charts import Tab
        
        # 人口年龄结构饼图
        population_data = [
            ["0～14岁人口", age_0_14],
            ["15～64岁人口", age_15_64],
            ["65岁及以上人口", age_65_plus]
        ]
        
        pie_population = (
            Pie(init_opts=opts.InitOpts(theme=ThemeType.MACARONS, width="900px", height="600px"))
            .add(
                "人口年龄结构",
                population_data,
                radius=["20%", "45%"],
                center=["25%", "50%"],
                rosetype="radius"
            )
            .set_global_opts(
                title_opts=opts.TitleOpts(
                    title="2023年人口年龄结构与抚养比情况",
                    subtitle="人口单位：万人  抚养比单位：%",
                    pos_left="center"
                ),
                legend_opts=opts.LegendOpts(orient="vertical", pos_top="20%", pos_left="70%"),
                tooltip_opts=opts.TooltipOpts(formatter="{b}: {c}万人 ({d}%)")
            )
            .set_series_opts(
                label_opts=opts.LabelOpts(formatter="{b}：{c}万人")
            )
        )
        
        # 抚养比圆环图
        ratio_data = [
            ["总抚养比", total_ratio],
            ["少儿抚养比", child_ratio],  
            ["老年抚养比", elderly_ratio]
        ]
        
        # 在人口饼图上添加抚养比数据
        pie_population.add(
            "抚养比",
            ratio_data,
            radius=["20%", "45%"],
            center=["75%", "50%"]
        )
        
        # 设置全局配置
        pie_population.set_global_opts(
            title_opts=opts.TitleOpts(
                title="2023年人口年龄结构与抚养比情况",
                subtitle="人口单位：万人  抚养比单位：%",
                pos_left="center"
            ),
            legend_opts=opts.LegendOpts(
                orient="horizontal",
                pos_left="center",
                pos_bottom="5%"
            ),
            tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{b}: {c} ({d}%)")
        )
        
        pie_population.render("任务三_人口年龄结构与抚养比情况.html")
        print("✅ 任务三完成，生成文件：任务三_人口年龄结构与抚养比情况.html")
    
    # 任务四：房地产投资地图
    if realestate_df is not None:
        print("\n🗺️ 任务四：绘制房地产投资地图...")
        
        # 处理省份名称映射
        province_mapping = {
            '北京市': '北京', '天津市': '天津', '上海市': '上海', '重庆市': '重庆',
            '河北省': '河北', '山西省': '山西', '辽宁省': '辽宁', '吉林省': '吉林',
            '黑龙江省': '黑龙江', '江苏省': '江苏', '浙江省': '浙江', '安徽省': '安徽',
            '福建省': '福建', '江西省': '江西', '山东省': '山东', '河南省': '河南',
            '湖北省': '湖北', '湖南省': '湖南', '广东省': '广东', '海南省': '海南',
            '四川省': '四川', '贵州省': '贵州', '云南省': '云南', '陕西省': '陕西',
            '甘肃省': '甘肃', '青海省': '青海', '台湾省': '台湾',
            '内蒙古自治区': '内蒙古', '广西壮族自治区': '广西', '西藏自治区': '西藏',
            '宁夏回族自治区': '宁夏', '新疆维吾尔自治区': '新疆',
            '香港特别行政区': '香港', '澳门特别行政区': '澳门'
        }
        
        map_data = []
        values = []
        
        for _, row in realestate_df.iterrows():
            province = str(row.iloc[0]).strip()
            value = float(row.iloc[1])
            
            # 标准化省份名称
            standard_name = province_mapping.get(province, province)
            map_data.append([standard_name, value])
            values.append(value)
        
        # 计算数值范围
        min_val = min(values)
        max_val = max(values)
        
        # 创建地图
        map_chart = (
            Map(init_opts=opts.InitOpts(width="1000px", height="700px", theme=ThemeType.MACARONS))
            .add("房地产投资累计值", map_data, "china")
            .set_global_opts(
                title_opts=opts.TitleOpts(
                    title="2024年12月全国地区房地产投资累计值",
                    subtitle="单位：亿元",
                    pos_left="center"
                ),
                visualmap_opts=opts.VisualMapOpts(
                    max_=max_val,
                    min_=min_val,
                    range_text=["高", "低"],
                    is_calculable=True,
                    range_color=["#D7DA8B", "#E15457"],
                    pieces=[
                        {"min": 0, "max": 1000, "label": "0-1000亿", "color": "#D7DA8B"},
                        {"min": 1000, "max": 5000, "label": "1000-5000亿", "color": "#E1C568"},
                        {"min": 5000, "max": 10000, "label": "5000-10000亿", "color": "#E89C3C"},
                        {"min": 10000, "max": 15000, "label": "10000-15000亿", "color": "#E15457"},
                        {"min": 15000, "label": "15000亿以上", "color": "#B03A5B"}
                    ]
                ),
                tooltip_opts=opts.TooltipOpts(formatter="{b}: {c}亿元")
            )
        )
        
        map_chart.render("任务四_全国地区房地产投资累计值地图.html")
        print("✅ 任务四完成，生成文件：任务四_全国地区房地产投资累计值地图.html")
        
        # 打印统计信息
        print(f"📊 数据统计：")
        print(f"   最大值：{max_val:.2f}亿元")
        print(f"   最小值：{min_val:.2f}亿元")
        print(f"   平均值：{np.mean(values):.2f}亿元")
    
    print("\n🎉 所有可视化任务完成！")
    print("\n📁 生成的文件列表：")
    print("   - 任务一_有线广播电视用户数情况.html")
    print("   - 任务二_国产和进口电影票房收入.html")
    print("   - 任务三_人口年龄结构与抚养比情况.html")
    print("   - 任务四_全国地区房地产投资累计值地图.html")
    print("\n💡 提示：请用浏览器打开HTML文件查看交互式图表")

if __name__ == "__main__":
    main() 